<?php
	namespace app\index\controller;

	use \think\Db;

	use \think\Session;

	class Cart extends Base{

		// 获取购物车的数据
		public function index(){
			
			try{

				$token=$this->token;

				$row=[];

				// 如果有token就进行验证
				if($token){
					$row=$this->redis->hgetall($token);
				}
				

				$data=[];

				// 如果token有效就把该用户下的购物车数据查询出来
				if($row){

					$carts=Db::name('carts')->where(['carts_userId'=>$row['u_id']])->select();

					$se_carts=session::get('carts');

					if($se_carts){

						// 判断登录之前session里面是否有购物车的数据

						$data=[];

						$gids=array_column($carts,'carts_goodsId');
						// 获取购物车的所有的商品ID


						foreach($se_carts as $k=>$v){

							$index=array_search($v['carts_goodsId'],$gids);

							

							if($index && $carts[$index]['carts_attr']==$v['carts_attr'] ){

								/*
									判断session下的购物车的商品id如果等于数据库下的商品ID并且商品规格也相等就修改数量，否则就添加
							 	*/

								$id=$carts[$index]['carts_id'];

								$res=Db::name('carts')->where(['carts_id'=>$id])->setInc('carts_goodsNum',$v['carts_goodsNum']);

								if($res){

									/*
									数量修改成功，就把数组对应的的购物车数量也进行修改
									 */

									$carts[$index]['carts_goodsNum']=$carts[$index]['carts_goodsNum']+$v['carts_goodsNum'];

								}

							}else{
								
								$v['carts_userId']=$row['u_id'];

								$v['carts_id']=null;

								$data[]=$v;

							}
							
						}

						if($data){
							$res=Db::name('carts')->insertAll($data);
						}
						
						session::set('carts',null);
						
					}
					
					$data=$carts;
				}else{

					$carts=session::get('carts');

					if($carts){

						$data=$carts;

					}


				}


				/*
					如果购物车有数据，就查询购物车下的商品，判断该商品是否能购买
				 */
				if($data){
					$gids=array_column($data, 'carts_goodsId');

					$goods=[];

					$good=Db::name('goods')->field('g_id,g_isSale,g_dataFlag,g_limitNum')->where(['g_id'=>['in',$gids]])->select();

					foreach($good as $k=>$v){
						$goods[$v['g_id']]=$v;
					}

					foreach($data as $k=>$v){
						$good=$goods[$v['carts_goodsId']];

						$data[$k]['buy']=true;
						/*
							buy:如果为true就是该商品可购买,否则就是不能被购买
						 */ 
							
						// 判断该商品是否下架或被删除
						if($good['g_isSale']==-1 || $good['g_dataFlag']==-1){
							$data[$k]['buy']=false;
						}

						// 商品的限购数量
						$data[$k]['limit']=$good['g_limitNum'];
					}
				}

				return $this->data($data);

				}catch(\Exception $e){

					return $this->err($e);

				}

		}

		// 添加购物车
		public function add(){
			try{
				if($this->method=='post'){


					$token=$this->token;

					$num=(int)input('post.num');

					$gid=(int)input('post.gid');

					$attr=input('post.attr');

					$type=input('post.type');
					/*用于判断该数据是从商品详情页发生过来的，还是从购物车页面*/

					$user=[];

					$goods=Db::name('goods')->find($gid);

					// 如果商品不存在，或是下架就不让他加入购物车
					if(!$goods || $goods['g_isSale']==-1 || $goods['g_dataFlag']==-1){
						$this->json(['code'=>0,'msg'=>'商品下架或失效']);
					}

					$pric=$goods['g_money'];

					$stock=$goods['g_stock'];

					$proid=0;

					if($goods['g_isSpec']==1){

						$row=[];

						if($attr){

							$row=Db::name('goods_property')->where(['pro_goodsId'=>$gid,'pro_spec'=>$attr])->find();

						}
						/*
						判断该商品是否有该规格选项
						 */
						if(!$row){
							$this->json(['code'=>'0','msg'=>'商品下架或失效']);
						}

						$proid=$row['pro_id'];

						$pric=$row['pro_price'];

						$stock=$row['pro_stock'];
						
					}

					if($token){
						$user=$this->redis->hgetall($token);
					}

					/*
					BUG:限购未判断
					 */
					
					$msg=['code'=>1,'msg'=>'操作成功'];

					// $order=Db::name('');

					if($user){

						// 登陆状态操作购物车

						$carts=Db::name('carts')->where(['carts_goodsId'=>$gid,'carts_attr'=>$attr,'carts_userId'=>$user['u_id']])->find();

						 /* 
						* 判断该类商品是否存在购物车中
						* 如果存在就就行修改购物车商品的数量
						* 否则就添加该商品到购物车 
						 */
						if($carts){

							if($type=='goods'){

								/*
								判断是否是商品详情页提交过来的数据，因为商品详情页传过来的num,是需要操作的数量，而购物车页面传过来的是直接修改的量
								 */

								$num+=$carts['carts_goodsNum'];
							}

							if($num>$goods['g_limitNum'] && $goods['g_limitNum']!=0 && $num>$carts['carts_goodsNum']){

								/*
									为什么要写$num>$carts['carts_goodsNum']

									因为购物车页面,传过来的num,是直接需要修改的数量,不是 1或者-1,所有要写该判断。

									例如：购物车原本数量6件,我们限购3件，如果传过来的num是7说明他点击了添加，否则传过来的num是否，那他点击的是减少，那么我们不要提醒他。
								 */

								// 判断是否超出限购
								
								$num=$goods['g_limitNum'];
								
								$msg=['code'=>0,'msg'=>'每人限购'.$num.'件','num'=>$num];

							}else if($num>$stock  && $num>$carts['carts_goodsNum']){

								// 判断库存是否够供应

								$num=$stock;

								$msg=['code'=>0,'msg'=>'库存仅剩'.$stock.'件','num'=>$num];
							}
							
							$res=Db::name('carts')->where(['carts_id'=>$carts['carts_id']])->update(['carts_goodsNum'=>$num]);

							/*if($type=='goods'){
								$res=$res->setInc('carts_goodsNum',$num);
							}else{
								$res=$res;
							}*/
							

							$sql=Db::getlastsql();
						}else{



							if($num>$goods['g_limitNum'] && $goods['g_limitNum']!=0){
								$this->json(['code'=>0,'msg'=>'每人限购'.$goods['g_limitNum'].'件']);
							}

							if($num>$stock){

								$this->json(['code'=>0,'msg'=>'库存仅剩'.$stock.'件']);
							}

							$res=Db::name('carts')->insert(['carts_userId'=>$user['u_id'],'carts_goodsId'=>$gid,'carts_goodsName'=>$goods['g_name'],'carts_goodsIcon'=>$goods['g_icon'],'carts_pric'=>$pric,'carts_attr'=>$attr,'carts_proId'=>$proid,'carts_goodsNum'=>$num]);

							if($res){
								$this->json($msg);
							}

							$this->json(['code'=>0,'msg'=>'操作失败']);

							// goods
						}

					}else{

						// 未登陆状态操作购物车

						$carts=(array)Session::get('carts');

						$index=-1;

						foreach($carts as $k=>$v){
							if($v['carts_goodsId']==$gid && $v['carts_attr']==$attr){

								/*判断商品是否存在购物车的session*/

								$index=$k;

								break;
							}
						}

						// 如果购物车已存在session中就改变数量否则就执行添加
						if($index!=-1){

							if($type=='goods'){
								$num+=$carts[$index]['carts_goodsNum'];
							}

							if($num>$goods['g_limitNum'] && $goods['g_limitNum']!=0 && $num>$carts[$index]['carts_goodsNum']){

								$num=$goods['g_limitNum'];
								
								$msg=['code'=>0,'msg'=>'每人限购'.$num.'件','num'=>$num];
							}else if($num>$stock){

								$num=$stock;

								$msg=['code'=>0,'msg'=>'库存仅剩'.$stock.'件','num'=>$num];
							}
							
							$carts[$index]['carts_goodsNum']=$num;
							
						}else{
							if($num>$goods['g_limitNum'] && $goods['g_limitNum']!=0){
								$this->json(['code'=>0,'msg'=>'每人限购'.$goods['g_limitNum'].'件']);
							}

							if($num>$stock){

								$this->json(['code'=>0,'msg'=>'库存仅剩'.$stock.'件']);
							}

							$id=count($carts)+1;

							$data=['carts_id'=>$id,'carts_goodsId'=>$gid,'carts_goodsName'=>$goods['g_name'],'carts_goodsIcon'=>$goods['g_icon'],'carts_pric'=>$pric,'carts_attr'=>$attr,'carts_proId'=>$proid,'carts_goodsNum'=>$num];

							array_push($carts,$data);
						}

						session::set('carts',$carts);

					}

					$this->json($msg);

				}else{
					echo '拒绝访问';
				}
			}catch(\Exception $e){
				return $this->err($e);
			}
		}

		// 删除购物车
		public function dele(){
			try{
				if($this->method=='post'){
					$id=(int)input('post.id');

					if(!$id){
						$this->json(['code'=>0,'msg'=>'非法请求']);
						// 判断post是否有合法id，没有的话就不然他往下执行
					}

					$user=[];

					//  查看token是否有值，如果有值就查询token对应的用户
					if($this->token){
						
						$user=$this->redis->hgetall($this->token);

					}


					if($user){

						// 用户登录状态删除购物车

						$res=Db::name('carts')->where(['carts_id'=>$id,'carts_userId'=>$user['u_id']])->delete();
					}else{
						// 用户未登录状态删除购物车
						
						$res=false;

						$carts=session::get('carts');

						if($carts){
							foreach($carts as $k=>$v){
								if($v['carts_id']==$id){
									unset($carts[$k]);

									$res=true;

									session::set('carts',$carts);

									break;
								}
							}
						}
					}

					if($res){
						$this->json(['code'=>1,'msg'=>'']);
						// 操作成功
					}

					$this->json(['code'=>0,'msg'=>'操作失败']);

				}else{
					echo '拒绝访问';
				}
			}catch(\Exception $e){
				return $this->err($e);
			}
		}
	}
?>